Supplement 1. Systematic review

PRISMA flowchart

Donne moi les chiffres quand tu as fini, j’insèrerai

PRISMAstatement::prisma(found = 8002,
       found_other = 7,
       no_dupes = 7187, 
       screened = 7187, 
       screen_exclusions = 6913, 
       full_text = 274,
       full_text_exclusions = 124, 
       qualitative = 150, 
       quantitative = 150,
       width = 800, height = 1200)

Overall N studies + participants

dat_tot
## # A tibble: 1 x 4
##   n_studies  n_es n_nexp_out n_exp_out
##       <int> <dbl>      <dbl>     <dbl>
## 1       144   647       8362      8045

N studies (adjustment discarded)

dat.borenstein %>%
    group_by(outcome_RDoC_agg) %>%
    summarise(n_es = sum(trial),
              n_nexp = sum(n_nexp),
              n_nexp = sum(n_nexp),
              nstudy1 = n(),
              n_study2 = length(unique(ID_study)))
## # A tibble: 4 x 5
##   outcome_RDoC_agg                       n_es n_nexp nstudy1 n_study2
##   <chr>                                 <dbl>  <dbl>   <int>    <int>
## 1 Mixed social processes                  223   5506      90       87
## 2 Reception of facial communication       186   2168      48       45
## 3 Reception of non-facial communication    28    580      10        9
## 4 Understanding mental states             210   2670      65       60

N studies (adjustment splitted)

synth_n = dat.borenstein %>%
    group_by(outcome_RDoC) %>%
    summarise(n_es = sum(trial),
              n_exp = sum(n_exp),
              n_nexp = sum(n_nexp),
              nstudy1 = n(),
              n_study2 = length(unique(ID_study)))
synth_n
## # A tibble: 8 x 6
##   outcome_RDoC                                 n_es n_exp n_nexp nstudy1 n_stu~1
##   <chr>                                       <dbl> <dbl>  <dbl>   <int>   <int>
## 1 Mixed social processes (adjusted)              14   277    306       8       8
## 2 Mixed social processes (non-adjusted)         209  5570   5200      82      82
## 3 Reception of facial communication (adjuste~    18   382    511       6       6
## 4 Reception of facial communication (non-adj~   168  1712   1657      42      42
## 5 Reception of non-facial communication (adj~     3   141    254       2       2
## 6 Reception of non-facial communication (non~    25   381    326       8       8
## 7 Understanding mental states (adjusted)         24   245    274       9       9
## 8 Understanding mental states (non-adjusted)    186  2521   2396      56      56
## # ... with abbreviated variable name 1: n_study2

Supplement 2. ES visualization

Distribution of ES

ggplot(dat.meta, aes(x = es_adj, y = es)) + 
  geom_jitter(alpha = 0.3, width = 0.35, size = 2) +
    geom_violin(size = 0.5, alpha = 0.5) +
theme_bw() 

Distribution of ES / outcomes

2 plots, tu choisis celui qui tu préfères

ggplot(dat.meta, aes(x = outcome_RDoC_agg, y = es)) + 
       geom_jitter(width = 0.05, dotsize = 0.1, alpha = 0.2, aes(fill = ID)) +        geom_boxplot(trim=FALSE, alpha = 0.6) +
      facet_grid(es_adj ~ "") +
       theme_bw() +
      labs(y = "Standardized mean difference (SMD)", x = "") +
        guides(fill=FALSE) +
       coord_flip()

ggplot(dat.meta, aes(x = outcome_RDoC_agg, y = es)) + 
    geom_violin(aes(fill = outcome_RDoC_agg), alpha = 0.3) +
  geom_jitter(alpha = 0.2, width = 0.1) +
    geom_boxplot(width=0.1)+
    facet_grid(es_adj ~ "") +
    theme_bw() +
    labs(y = "Standardized mean difference (SMD)", x = "") +
    theme(text = element_text(size = 18),
          legend.position = "none",
          axis.title.y = element_text(size=12, face="bold"), 
          axis.title.x = element_text(size=12, face="bold")) +
    coord_flip()  


Supplement 3. Main analysis

Data analysis

V.SCE  <- with(dat.meta,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))

# all.equal(dat.meta$se^2, diag(unlist(V.SCE)))

SCE <- metafor::rma.mv(yi = es, V = V.SCE, 
                       data = dat.meta, 
                       mods = ~ outcome_RDoC - 1,
                       random = ~ outcome_RDoC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

SCE.ISQ <- metafor::rma.mv(yi = es, V = V.SCE, 
                       data = dat.meta, 
                       mods = ~ outcome_RDoC - 1)
het = function(x, y) {
  i2 = NA
  for (i in 1:nrow(vcov(x))) {
    i2[i] = 100 * (vcov(x)[i,i] - vcov(y)[i,i]) / vcov(x)[i,i]
  }
  return(i2)
}
# 
# W <- solve(V.SCE)
# X <- model.matrix(SCE)
# P <- W - W %*% X %*% solve(t(X) %*% W %*% X) %*% t(X) %*% W
# 100 * SCE$tau2 / (SCE$tau2 + (SCE$k-SCE$p)/sum(diag(P)))


res.SCE <- data.frame(clubSandwich::coef_test(SCE, vcov = "CR2", cluster = dat.meta$ID_study)) # , cluster = df.ES$researchgroup
res.SCE.ci = data.frame(clubSandwich::conf_int(SCE, vcov = "CR2", cluster = dat.meta$ID_study))
res.SCE$target <- gsub("outcome_RDoC", "", row.names(res.SCE))
res.SCE.ci$target <- gsub("outcome_RDoC", "", row.names(res.SCE.ci))
res.SCE = dplyr::left_join(res.SCE, res.SCE.ci)
res.SCE$I2 = het(SCE, SCE.ISQ)
res_main <- left_join(res.SCE, dat_RDoC)
## Joining, by = "target"
res_main$p_Satt_bonferroni = res_main$p_Satt * 8
res_main[,c("beta", "SE", "tstat", "df", "p_Satt",
            "p_Satt_bonferroni", "CI_L", "CI_U", "I2", 
            "n_studies",    "n_nexp_out" , "n_exp_out")] <- apply(
res_main[,c("beta", "SE", "tstat", "df", "p_Satt",
            "p_Satt_bonferroni", "CI_L", "CI_U", "I2", 
            "n_studies",    "n_nexp_out" , "n_exp_out")], 2, function(x) round(x, 3))
DT::datatable(res_main, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

Forest plot

res_main$SE_COR = (res_main$CI_U - res_main$CI_L) / 3.92

res_main$raw_outcome <- gsub(r"{\s*\([^\)]+\)}","",
                            as.character(res_main$outcome_RDoC))
tab.plot <- data.frame(
  Outcome = do.call(rbind, lapply(res_main$outcome_RDoC, 
                                  function(x) paste(strwrap(x, width = 60), 
                                                    collapse = "\n"))),
  n_ADHD = res_main$n_exp_out,
  n_nexpT = res_main$n_nexp_out,
  n_studies = res_main$n_studies,
  I2 = paste0(round(res_main$I2), "%"))

value_num_plot = data.frame(apply(res_main[, c("beta", "SE_COR")], 2, function(x) as.numeric(as.character(x))))

forest_modif(x = value_num_plot[ ,c("beta", "SE_COR")], 
           variant = "classic",
           col = "Greys", xlab = "SMD", annotate_CI = TRUE,
           study_table = tab.plot,
           group = res_main$raw_outcome,
           type = "study_only",
           text_size = 3.5,
           x_limit = c(-1, 2),
           N = tab.plot$n_ADHD + tab.plot$n_nexpT,
           x_breaks = seq(-3, 3, 1)
           )

Diagnostics

# windows() ## create window to plot your file
metafor::profile.rma.mv(SCE)
## Profiling tau2 = 1

## Profiling tau2 = 2

## Profiling tau2 = 3

## Profiling tau2 = 4

## Profiling tau2 = 5

## Profiling tau2 = 6

## Profiling tau2 = 7

## Profiling tau2 = 8

# dev.off()

Supplement 4. Supplementary analyses

S1. Borenstein aggregated approach

meta.reg <- metafor::rma.mv(yi = es, V = se^2, 
                           data = dat.borenstein, 
                           random = ~ outcome_RDoC | ID_study,
                           struct = "DIAG",
                           mods = ~ outcome_RDoC - 1)

res.S1.a.clean = data.frame(
  beta = meta.reg$beta,
  se = meta.reg$se,
  ci_lo = meta.reg$ci.lb,
  ci_up = meta.reg$ci.ub,
  pval = meta.reg$pval, 
  target = gsub("outcome_RDoC", "", row.names(meta.reg$b)))

res.S1 <- left_join(res.S1.a.clean, dat_RDoC)
## Joining, by = "target"
DT::datatable(res.S1, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

S2. RVE approach

robu.main <- robumeta::robu(es ~ outcome_RDoC - 1, 
                            data = dat.meta, 
                            studynum = ID_study,
                            var.eff.size = se^2,
                            modelweights = "CORR",
                            small = TRUE,
                            rho = 0.8)

dat_robu_main = data.frame(
  beta = robu.main$reg_table$b.r,
  se = robu.main$reg_table$SE,
  ci_lo = robu.main$reg_table$CI.L,
  ci_up = robu.main$reg_table$CI.U,
  pval = robu.main$reg_table$prob, 
  target = gsub("outcome_RDoC", "", row.names(meta.reg$b)),
  target2 = robu.main$reg_table$labels)

DT::datatable(dat_robu_main, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

SCE vs RVE vs Borenstein

res.SCE.main = data.frame(
    beta = res.SCE$beta,
    se = res.SCE$SE,
    ci_lo = res.SCE$CI_L,
    ci_up = res.SCE$CI_U,
    pval = res.SCE$p_Satt, 
    target =res.SCE$target)
res.SCE.main$Analysis = "SCE approach"
res.S1.a.clean$Analysis = "Borenstein approach"
dat_robu_main$Analysis = "RVE approach"
dat_forest_S1 = bind_rows(res.SCE.main,
                          res.S1.a.clean,
                          dat_robu_main)


meta_res_tot = meta::metagen(TE = beta, seTE = (ci_up-ci_lo)/(2*qnorm(.975)), 
                             sm = "SMD", data = dat_forest_S1,
                             subgroup = target, 
                             studlab = Analysis)

meta::forest(meta_res_tot, random = FALSE, fixed = FALSE, 
             leftcols = c("studlab"),
             text.subgroup.nohet = FALSE, print.tau2 = FALSE, print.I2 = FALSE, print.pval.Q = FALSE,
             plotwidth = "15cm", colgap.left = "1cm", colgap.right = "1cm",
             leftlabs= c(""),
             just = "right", spacing = 0.8)

S3. Small study effects & ESS

Nakaraga method

dat.meta$inv_n_tilda <- with(dat.meta, (n_nexp + n_exp)/(n_nexp*n_exp))
dat.meta$sqrt_inv_n_tilda <- with(dat.meta, sqrt(inv_n_tilda))

nak.pb = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ 1 + sqrt_inv_n_tilda + outcome_RDoC,
                      random = ~ outcome_RDoC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(nak.pb, vcov = "CR2", cluster = dat.meta$ID_study)
##                                                              Coef. Estimate
## 1                                                          intrcpt   0.1052
## 2                                                 sqrt_inv_n_tilda   5.3163
## 3                outcome_RDoCMixed social processes (non-adjusted)  -0.0949
## 4         outcome_RDoCReception of facial communication (adjusted)  -0.7971
## 5     outcome_RDoCReception of facial communication (non-adjusted)  -0.7749
## 6     outcome_RDoCReception of non-facial communication (adjusted)  -0.9621
## 7 outcome_RDoCReception of non-facial communication (non-adjusted)  -0.8632
## 8               outcome_RDoCUnderstanding mental states (adjusted)  -0.8543
## 9           outcome_RDoCUnderstanding mental states (non-adjusted)  -0.6194
##      SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.541  0.194  8.97       0.8502     
## 2 1.969  2.700 17.39       0.0150    *
## 3 0.258 -0.368  8.56       0.7216     
## 4 0.319 -2.500 10.61       0.0302    *
## 5 0.264 -2.932  9.35       0.0161    *
## 6 0.368 -2.615  2.14       0.1122     
## 7 0.292 -2.953 11.74       0.0123    *
## 8 0.317 -2.697  9.79       0.0228    *
## 9 0.259 -2.393  9.53       0.0389    *

PET-PEESE method (Stanley 2014)

PET = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ se,
                      random = ~ outcome_RDoC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(PET, vcov = "CR2", cluster = dat.meta$ID_study)
##     Coef. Estimate    SE t-stat d.f. p-val (Satt) Sig.
## 1 intrcpt    -2.91 0.453  -6.42 72.7       <0.001  ***
## 2      se    14.53 1.692   8.59 24.5       <0.001  ***
dat.meta$var = dat.meta$se^2
PET = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ var,
                      random = ~ outcome_RDoC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(PET, vcov = "CR2", cluster = dat.meta$ID_study)
##     Coef. Estimate    SE t-stat d.f. p-val (Satt) Sig.
## 1 intrcpt    -0.86 0.187  -4.61 75.9       <0.001  ***
## 2     var    23.47 2.454   9.56 18.9       <0.001  ***

Split by outcome : Egger’s test + ESS

dat_ess = data.frame(
  meta_review = "Haza",
  study = dat.borenstein$ID_study,
  factor = dat.borenstein$outcome_RDoC,
  value = dat.borenstein$es,
  se = dat.borenstein$se,
  n_cases = dat.borenstein$n_exp,
  n_controls = dat.borenstein$n_nexp,
  measure = "G")
  
umb = metaumbrella::umbrella(dat_ess)
## Analyzing factor: Understanding mental states (non-adjusted) 
## Analyzing factor: Mixed social processes (non-adjusted) 
## Analyzing factor: Mixed social processes (adjusted) 
## Analyzing factor: Understanding mental states (adjusted) 
## Analyzing factor: Reception of facial communication (non-adjusted) 
## Analyzing factor: Reception of non-facial communication (non-adjusted)
## - An error occured when converting the standard error of G to SMD. The standard error of the SMD was assumed to be equal to 'sqrt(1/n_cases + 1/n_controls)'.
## Analyzing factor: Reception of facial communication (adjusted) 
## Analyzing factor: Reception of non-facial communication (adjusted)
umb
## 
## Umbrella review:
##                                                 Factor n_studies total_n
## 1           Understanding mental states (non-adjusted)        56    4917
## 2                Mixed social processes (non-adjusted)        82   10770
## 3                    Mixed social processes (adjusted)         8     583
## 4               Understanding mental states (adjusted)         9     519
## 5     Reception of facial communication (non-adjusted)        42    3369
## 6 Reception of non-facial communication (non-adjusted)         8     707
## 7         Reception of facial communication (adjusted)         6     893
## 8     Reception of non-facial communication (adjusted)         2     395
##   n_cases n_controls measure value        value_CI    eG           eG_CI   eOR
## 1    2521       2396       G 0.904  [0.731, 1.078] 0.904  [0.731, 1.078] 5.158
## 2    5570       5200       G 1.107  [0.957, 1.257] 1.107  [0.957, 1.257] 7.450
## 3     277        306       G 0.983   [0.336, 1.63] 0.983   [0.336, 1.63] 5.950
## 4     245        274       G 0.808  [0.495, 1.121] 0.808  [0.495, 1.121] 4.331
## 5    1712       1657       G 0.768  [0.614, 0.922] 0.768  [0.614, 0.922] 4.029
## 6     381        326       G 0.851  [0.419, 1.283] 0.851  [0.419, 1.283] 4.683
## 7     382        511       G 0.407  [0.219, 0.595] 0.407  [0.219, 0.595] 2.093
## 8     141        254       G 0.046 [-0.241, 0.333] 0.046 [-0.241, 0.333] 1.087
##            eOR_CI  p_value     I2           PI_eG           PI_eOR     egger_p
## 1  [3.766, 7.064] 1.60e-24 85.229 [-0.323, 2.132]  [0.557, 47.779]    1.56e-01
## 2  [5.677, 9.778] 1.60e-47 89.997 [-0.182, 2.397]  [0.719, 77.243]    3.65e-04
## 3  [1.84, 19.238] 2.90e-03 91.492 [-1.361, 3.328] [0.085, 418.069]    1.16e-01
## 4  [2.455, 7.643] 4.22e-07 69.564 [-0.219, 1.835]  [0.672, 27.903]    2.29e-01
## 5  [3.048, 5.325] 1.24e-22 82.455 [-0.139, 1.676]  [0.777, 20.893]    1.32e-01
## 6 [2.138, 10.257] 1.14e-04 80.489 [-0.617, 2.319]   [0.327, 67.13]    1.50e-04
## 7  [1.488, 2.943] 2.19e-05 48.194  [-0.11, 0.925]    [0.818, 5.35]    3.69e-01
## 8   [0.646, 1.83] 7.53e-01  0.000     < 3 studies      < 3 studies < 3 studies
##      ESB_p power_med     JK_p   largest_CI_eG  largest_CI_eOR rob amstar
## 1 6.51e-01     100.0 1.99e-23 [-0.017, 0.904]   [0.97, 5.152]  NA     NA
## 2 6.85e-01     100.0 4.32e-46  [0.281, 1.239]  [1.666, 9.464]  NA     NA
## 3 3.24e-01     100.0 1.40e-02  [0.623, 1.315] [3.095, 10.864]  NA     NA
## 4 7.40e-01     100.0 1.54e-05  [0.271, 0.939]  [1.634, 5.494]  NA     NA
## 5 9.65e-01     100.0 2.80e-21  [1.259, 1.804] [9.804, 26.348]  NA     NA
## 6 8.16e-02     100.0 1.13e-03  [-0.12, 0.493]  [0.804, 2.444]  NA     NA
## 7 4.96e-01     100.0 2.30e-03  [0.165, 0.879]  [1.348, 4.928]  NA     NA
## 8     <NA>      99.7 9.74e-01 [-0.361, 0.373]  [0.519, 1.969]  NA     NA
# metaumbrella::umbrella(subset(dat_ess, factor == "Mixed social processes (non-adjusted)"))[[1]]$egger$p.value
# metafor::regtest(x = dat_sub$es, sei = dat_sub$se, model = "lm", predictor="sei")$pval

Plot

ggplot(dat.borenstein, aes(x=es, y=se)) + 
    geom_point(alpha = 0.2) + 
    geom_smooth(method="lm") + 
    facet_wrap(~outcome_RDoC, scales='free') +
    theme_bw()
## `geom_smooth()` using formula 'y ~ x'
## Warning in qt((1 - level)/2, df): NaNs produced
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf

S4. type of publication

SCE.S2 <- metafor::rma.mv(yi = es, V = V.SCE, 
                       data = dat.meta, 
                       mods = ~ type_publication - 1 + outcome_RDoC,
                       random = ~ outcome_RDoC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

clubSandwich::coef_test(SCE.S2, vcov = "CR2", cluster = dat.meta$ID_study)
##                                                               Coef. Estimate
## 1                                           type_publicationArticle    1.467
## 2                                        type_publicationConférence    3.693
## 3                                            type_publicationPoster    1.945
## 4                                             type_publicationThèse    1.537
## 5                 outcome_RDoCMixed social processes (non-adjusted)   -0.284
## 6          outcome_RDoCReception of facial communication (adjusted)   -1.092
## 7      outcome_RDoCReception of facial communication (non-adjusted)   -0.826
## 8      outcome_RDoCReception of non-facial communication (adjusted)   -1.334
## 9  outcome_RDoCReception of non-facial communication (non-adjusted)   -0.995
## 10               outcome_RDoCUnderstanding mental states (adjusted)   -0.733
## 11           outcome_RDoCUnderstanding mental states (non-adjusted)   -0.648
##       SE t-stat  d.f. p-val (Satt) Sig.
## 1  0.234   6.26  7.00      < 0.001  ***
## 2  0.244  15.15  8.24      < 0.001  ***
## 3  0.617   3.15  1.67      0.10972     
## 4  0.256   5.99  9.75      < 0.001  ***
## 5  0.244  -1.17  8.24      0.27612     
## 6  0.237  -4.62  8.93      0.00128   **
## 7  0.246  -3.35  8.64      0.00899   **
## 8  0.232  -5.76  6.65      < 0.001  ***
## 9  0.284  -3.50 12.29      0.00420   **
## 10 0.265  -2.76  9.35      0.02118    *
## 11 0.243  -2.67  8.74      0.02634    *
ggplot(dat.borenstein, aes(x = type_publication, y = es)) + 
  geom_point(size = 3, alpha = 0.2) + 
  geom_boxplot() +
  theme_bw()

S5. Each facial emotion

Data analysis

dat.meta.S3 = subset(dat.meta, 
    emot_spec %in% c("Happy", "Sad", "Surprise", "Fear", "Disgust", "Anger") & 
      grepl("Reception of facial", dat.meta$outcome_RDoC, fixed = TRUE) & 
      !grepl("(adjusted)", dat.meta$outcome_RDoC, fixed = TRUE))

V.SCE.S3  <- with(dat.meta.S3,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study,
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = emot_spec))

# all.equal(dat.meta$se^2, diag(unlist(V.SCE)))

SCE.S3 <- metafor::rma.mv(yi = es, V = V.SCE.S3, 
                       data = dat.meta.S3, 
                       mods = ~ emot_spec - 1,
                       random = ~ emot_spec | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

SCE.ISQ.S3 <- metafor::rma.mv(yi = es, V = V.SCE.S3, 
                               data = dat.meta.S3, 
                               mods = ~ emot_spec - 1)

res.SCE.S3 <- data.frame(clubSandwich::coef_test(SCE.S3, vcov = "CR2", cluster = dat.meta.S3$ID_study)) # , cluster = df.ES$researchgroup
res.SCE.ci.S3 = data.frame(clubSandwich::conf_int(SCE.S3, vcov = "CR2", cluster = dat.meta.S3$ID_study))
res.SCE.S3$emot_spec <- gsub("emot_spec", "", row.names(res.SCE.S3))
res.SCE.ci.S3$emot_spec <- gsub("emot_spec", "", row.names(res.SCE.ci.S3))
res.SCE.S3 = dplyr::left_join(res.SCE.S3, res.SCE.ci.S3)
## Joining, by = c("beta", "SE", "df", "emot_spec")
res.SCE.S3$I2 = het(SCE.S3, SCE.ISQ.S3)
res.SCE.clean.S3 = subset(res.SCE.S3, SE > 0.000001)

Table

dat_emot$emot_spec = dat_emot$nom_sousdim_clean
res_S3 <- left_join(res.SCE.clean.S3, dat_emot)
## Joining, by = "emot_spec"
res_S3[,c("beta", "SE", "tstat", "df", "p_Satt", "CI_L", "CI_U", "I2", "n_studies",    "n_nexp_out" , "n_exp_out")] <- apply(res_S3[,c("beta", "SE", "tstat", "df", "p_Satt", "CI_L", "CI_U", "I2", "n_studies",    "n_nexp_out" , "n_exp_out")], 2, function(x) round(x, 3))
DT::datatable(res_S3, 
              rownames = FALSE,
              options = list(  # options
                scrollX = TRUE,
                dom = c('ft'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

Forest plot

res_S3$raw_outcome <- gsub(r"{\s*\([^\)]+\)}","",
                            as.character(res_S3$nom_sousdim_clean))
tab.plot.S3 <- data.frame(
  Outcome = do.call(rbind, lapply(res_S3$nom_sousdim_clean, 
                                  function(x) paste(strwrap(x, width = 60), 
                                                    collapse = "\n"))),
  n_ADHD = res_S3$n_exp_out,
  n_nexpT = res_S3$n_nexp_out,
  n_studies = res_S3$n_studies,
  I2 = paste0(round(res_S3$I2), "%"))

value_num_plot_S3 = data.frame(apply(res_S3[, c("beta", "SE")], 2, function(x) as.numeric(as.character(x))))

forest_modif(x = value_num_plot_S3[ ,c("beta", "SE")], 
           variant = "classic",
           col = "Greys", xlab = "SMD", annotate_CI = TRUE,
           study_table = tab.plot.S3,
           group = res_S3$raw_outcome,
           type = "study_only",
           text_size = 3.5,
           x_limit = c(-1, 2),
           N = tab.plot.S3$n_ADHD + tab.plot.S3$n_nexpT,
           x_breaks = seq(-3, 3, 1)
           )

S6. Effect of age

a. Age

dat.meta.S6 = subset(dat.meta, !is.na(age) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
V.SCE.S6  <- with(dat.meta.S6,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                              Coef. Estimate
## 1                                                          intrcpt  1.26246
## 2                                                              age -0.00415
## 3     outcome_RDoCReception of facial communication (non-adjusted) -0.44699
## 4           outcome_RDoCUnderstanding mental states (non-adjusted) -0.19454
## 5 age:outcome_RDoCReception of facial communication (non-adjusted) -0.01131
## 6       age:outcome_RDoCUnderstanding mental states (non-adjusted) -0.01733
##       SE  t-stat d.f. p-val (Satt) Sig.
## 1 1.0326  1.2226 17.7        0.237     
## 2 0.0994 -0.0418 15.5        0.967     
## 3 1.1470 -0.3897 32.4        0.699     
## 4 1.3378 -0.1454 34.8        0.885     
## 5 0.1105 -0.1023 26.5        0.919     
## 6 0.1279 -0.1355 30.6        0.893
anova(SCE.S6, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 0.1479, p-val = 0.9287
SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt   1.3479 0.4553
## 2                                                          age  -0.0125 0.0426
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.5644 0.1051
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.3769 0.1081
##   t-stat d.f. p-val (Satt) Sig.
## 1  2.961 43.5      0.00495   **
## 2 -0.294 32.8      0.77064     
## 3 -5.371 86.4      < 0.001  ***
## 4 -3.486 99.2      < 0.001  ***
ggplot(dat.meta.S6, aes(x = age, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

b. Age diff

dat.meta.S6 = subset(dat.meta, !is.na(age_diff) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
V.SCE.S6  <- with(dat.meta.S6,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age_diff * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                                   Coef.
## 1                                                               intrcpt
## 2                                                              age_diff
## 3          outcome_RDoCReception of facial communication (non-adjusted)
## 4                outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 age_diff:outcome_RDoCReception of facial communication (non-adjusted)
## 6       age_diff:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate     SE  t-stat   d.f. p-val (Satt) Sig.
## 1  1.21622 0.0785 15.4931  79.23       <0.001  ***
## 2 -0.05515 0.2292 -0.2406   3.44        0.823     
## 3 -0.55690 0.1106 -5.0361  87.49       <0.001  ***
## 4 -0.38005 0.1107 -3.4346 100.83       <0.001  ***
## 5 -0.04965 0.2488 -0.1996   5.46        0.849     
## 6  0.00274 0.2589  0.0106   5.34        0.992
anova(SCE.S6, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 1.4237, p-val = 0.4907
SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age_diff + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt    1.216 0.0761
## 2                                                     age_diff   -0.066 0.0601
## 3 outcome_RDoCReception of facial communication (non-adjusted)   -0.561 0.1083
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)   -0.379 0.1096
##   t-stat   d.f. p-val (Satt) Sig.
## 1  15.98  79.29       <0.001  ***
## 2  -1.10   6.23        0.313     
## 3  -5.18  88.49       <0.001  ***
## 4  -3.46 100.82       <0.001  ***
ggplot(dat.meta.S6, aes(x = age_diff, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth() +
    theme_bw()

S7. Effect of comorbidities

a. ASD

dat.meta.S7_a = subset(dat.meta, !is.na(percentage_asd) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]) & percentage_asd %in% c(0,100))
dat.meta.S7_a$percentage_asd = factor(dat.meta.S7_a$percentage_asd)
V.SCE.S7_a  <- with(dat.meta.S7_a,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S7_a <- metafor::rma.mv(yi = es, V = V.SCE.S7_a, 
                          data = dat.meta.S7_a, 
                          mods = ~ percentage_asd * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S7_a, vcov = "CR2", cluster = dat.meta.S7_a$ID_study)
##                                                                            Coef.
## 1                                                                        intrcpt
## 2                                                              percentage_asd100
## 3                   outcome_RDoCReception of facial communication (non-adjusted)
## 4                         outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1    1.333 0.0961  13.88 45.40      < 0.001  ***
## 2    1.059 0.2195   4.82  4.62      0.00588   **
## 3   -0.765 0.1375  -5.57 50.26      < 0.001  ***
## 4   -0.524 0.1413  -3.71 55.82      < 0.001  ***
## 5   -0.979 0.2187  -4.48  2.62      0.02762    *
## 6   -0.752 0.2507  -3.00  3.48      0.04775    *
anova(SCE.S7_a, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 187.9798, p-val < .0001
SCE.S7_a_ph = metafor::rma.mv(yi = es, V = V.SCE.S7_a, 
                data = dat.meta.S7_a, 
                mods = ~ percentage_asd : outcome_RDoC - 1,
                random = ~ outcome_RDoC | ID_study,
                struct = "DIAG",
                sparse = TRUE)
SCE.S7_a_ph
## 
## Multivariate Meta-Analysis Model (k = 376; method: REML)
## 
## Variance Components:
## 
## outer factor: ID_study     (nlvls = 76)
## inner factor: outcome_RDoC (nlvls = 3)
## 
##             estim    sqrt  k.lvl  fixed 
## tau^2.1    0.3634  0.6028    120     no 
## tau^2.2    0.2202  0.4693    131     no 
## tau^2.3    0.2980  0.5459    125     no 
##                                                       level 
## tau^2.1               Mixed social processes (non-adjusted) 
## tau^2.2    Reception of facial communication (non-adjusted) 
## tau^2.3          Understanding mental states (non-adjusted) 
## 
## Test for Residual Heterogeneity:
## QE(df = 370) = 6343.8250, p-val < .0001
## 
## Test of Moderators (coefficients 1:6):
## QM(df = 6) = 801.6536, p-val < .0001
## 
## Model Results:
## 
##                                                                                 estimate 
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)                 1.3334 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)               2.3923 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)      0.5682 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)    0.6484 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)            0.8093 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)          1.1162 
##                                                                                     se 
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)               0.0963 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)             0.1062 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)    0.1043 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)  0.1190 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)          0.1046 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)        0.1158 
##                                                                                    zval 
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)               13.8460 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)             22.5282 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)     5.4476 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)   5.4502 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)           7.7362 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)         9.6390 
##                                                                                   pval 
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)               <.0001 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)             <.0001 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)    <.0001 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)  <.0001 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)          <.0001 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)        <.0001 
##                                                                                  ci.lb 
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)               1.1447 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)             2.1842 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)    0.3638 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)  0.4152 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)          0.6043 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)        0.8892 
##                                                                                  ci.ub 
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)               1.5222 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)             2.6005 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)    0.7727 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)  0.8816 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)          1.0144 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)        1.3432 
##  
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)               *** 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)             *** 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)    *** 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)  *** 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)          *** 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)        *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(SCE.S7_a_ph, L=c(-1,1,0,0,0,0))
## 
## Hypothesis:                                                                                                                                                
## 1: -percentage_asd0:outcome_RDoCMixed social processes (non-adjusted) + percentage_asd100:outcome_RDoCMixed social processes (non-adjusted) = 0 
## 
## Results:
##    estimate     se    zval   pval 
## 1:   1.0589 0.0499 21.2047 <.0001 
## 
## Test of Hypothesis:
## QM(df = 1) = 449.6405, p-val < .0001
anova(SCE.S7_a_ph, L=c(0,0,-1,1,0,0))
## 
## Hypothesis:                                                                                                                                                                      
## 1: -percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted) + percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted) = 0 
## 
## Results:
##    estimate     se   zval   pval 
## 1:   0.0801 0.0594 1.3495 0.1772 
## 
## Test of Hypothesis:
## QM(df = 1) = 1.8212, p-val = 0.1772
anova(SCE.S7_a_ph, L=c(0,0,0,0,-1,1))
## 
## Hypothesis:                                                                                                                                                          
## 1: -percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted) + percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted) = 0 
## 
## Results:
##    estimate     se   zval   pval 
## 1:   0.3069 0.0520 5.9049 <.0001 
## 
## Test of Hypothesis:
## QM(df = 1) = 34.8673, p-val < .0001
ggplot(dat.meta.S7_a, aes(x = percentage_asd, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_boxplot(alpha = 0.2) + 
    theme_bw()

b. ODD/CD

dat.meta.S7_b = subset(dat.meta, !is.na(percentage_cd_odd) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S7_b$percentage_cd_odd = as.numeric(as.character(dat.meta.S7_b$percentage_cd_odd))
V.SCE.S7_b  <- with(dat.meta.S7_b,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S7_b <- metafor::rma.mv(yi = es, V = V.SCE.S7_b, 
                          data = dat.meta.S7_b, 
                          mods = ~ percentage_cd_odd * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S7_b, vcov = "CR2", cluster = dat.meta.S7_b$ID_study)
##                                                                            Coef.
## 1                                                                        intrcpt
## 2                                                              percentage_cd_odd
## 3                   outcome_RDoCReception of facial communication (non-adjusted)
## 4                         outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_cd_odd:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_cd_odd:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate      SE t-stat  d.f. p-val (Satt) Sig.
## 1  1.24897 0.12779   9.77 35.43      < 0.001  ***
## 2  0.00381 0.00237   1.61  1.20      0.32339     
## 3 -0.57724 0.16979  -3.40 50.73      0.00132   **
## 4 -0.38735 0.16563  -2.34 50.38      0.02336    *
## 5 -0.00349 0.00283  -1.23  1.74      0.35823     
## 6 -0.00473 0.00256  -1.85  1.68      0.22971
anova(SCE.S7_b, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 18.3078, p-val = 0.0001
SCE.S7_b_ph = metafor::rma.mv(yi = es, V = V.SCE.S7_b, 
                data = dat.meta.S7_b, 
                mods = ~ percentage_cd_odd : outcome_RDoC - 1,
                random = ~ outcome_RDoC | ID_study,
                struct = "DIAG",
                sparse = TRUE)
clubSandwich::coef_test(SCE.S7_b_ph, vcov = "CR2", cluster = dat.meta.S7_b$ID_study)
##                                                                            Coef.
## 1            percentage_cd_odd:outcome_RDoCMixed social processes (non-adjusted)
## 2 percentage_cd_odd:outcome_RDoCReception of facial communication (non-adjusted)
## 3       percentage_cd_odd:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate      SE t-stat d.f. p-val (Satt) Sig.
## 1  0.004147 0.00196  2.112 1.14        0.257     
## 2  0.000432 0.00153  0.282 2.25        0.801     
## 3 -0.000504 0.00102 -0.496 1.27        0.692
ggplot(dat.meta.S7_b, aes(x = percentage_cd_odd, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

S8. Effect of sex

dat.meta.S8 = subset(dat.meta, !is.na(sex) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S8$sex = as.numeric(as.character(dat.meta.S8$sex))
dat.meta.S8$sex[dat.meta.S8$sex > 100] <- NA
V.SCE.S8  <- with(dat.meta.S8,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S8 <- metafor::rma.mv(yi = es, V = V.SCE.S8, 
                          data = dat.meta.S8, 
                          mods = ~ sex * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S8, vcov = "CR2", cluster = dat.meta.S8$ID_study)
##                                                              Coef. Estimate
## 1                                                          intrcpt  1.44135
## 2                                                              sex -0.00777
## 3     outcome_RDoCReception of facial communication (non-adjusted) -0.86490
## 4           outcome_RDoCUnderstanding mental states (non-adjusted) -0.59449
## 5 sex:outcome_RDoCReception of facial communication (non-adjusted)  0.00958
## 6       sex:outcome_RDoCUnderstanding mental states (non-adjusted)  0.00691
##        SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.18176  7.930 26.89      < 0.001  ***
## 2 0.00627 -1.240  5.45      0.26564     
## 3 0.26479 -3.266 22.45      0.00347   **
## 4 0.23033 -2.581 28.37      0.01530    *
## 5 0.00971  0.986 10.41      0.34637     
## 6 0.00720  0.960 10.33      0.35881
anova(SCE.S8, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 5.7438, p-val = 0.0566
SCE.S8 <- metafor::rma.mv(yi = es, V = V.SCE.S8, 
                          data = dat.meta.S8, 
                          mods = ~ sex + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S8, vcov = "CR2", cluster = dat.meta.S8$ID_study)
##                                                          Coef. Estimate      SE
## 1                                                      intrcpt  1.35953 0.13810
## 2                                                          sex -0.00486 0.00453
## 3 outcome_RDoCReception of facial communication (non-adjusted) -0.60969 0.11629
## 4       outcome_RDoCUnderstanding mental states (non-adjusted) -0.41569 0.11203
##   t-stat d.f. p-val (Satt) Sig.
## 1   9.84 53.5       <0.001  ***
## 2  -1.07 10.9        0.306     
## 3  -5.24 70.8       <0.001  ***
## 4  -3.71 89.2       <0.001  ***
ggplot(dat.meta.S8, aes(x = sex, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

S9. Effect of IQ

a. IQ

dat.meta.S9 = subset(dat.meta, !is.na(iq) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S9$iq = as.numeric(as.character(dat.meta.S9$iq))
# dat.meta.S9$iq[dat.meta.S9$iq > 100] <- NA
V.SCE.S9  <- with(dat.meta.S9,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                             Coef.  Estimate
## 1                                                         intrcpt -0.904696
## 2                                                              iq  0.020699
## 3    outcome_RDoCReception of facial communication (non-adjusted)  2.137153
## 4          outcome_RDoCUnderstanding mental states (non-adjusted) -0.646296
## 5 iq:outcome_RDoCReception of facial communication (non-adjusted) -0.026903
## 6       iq:outcome_RDoCUnderstanding mental states (non-adjusted)  0.000924
##       SE  t-stat d.f. p-val (Satt) Sig.
## 1 7.2554 -0.1247 5.69        0.905     
## 2 0.0697  0.2969 5.82        0.777     
## 3 7.5143  0.2844 8.29        0.783     
## 4 9.2993 -0.0695 5.41        0.947     
## 5 0.0722 -0.3728 8.34        0.719     
## 6 0.0892  0.0104 5.28        0.992
anova(SCE.S9, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 2.2610, p-val = 0.3229
SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt  -0.3227 3.9968
## 2                                                           iq   0.0151 0.0385
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.6526 0.1537
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.5448 0.1387
##    t-stat  d.f. p-val (Satt) Sig.
## 1 -0.0807  9.77        0.937     
## 2  0.3924  9.79        0.703     
## 3 -4.2470 43.58       <0.001  ***
## 4 -3.9290 45.10       <0.001  ***
ggplot(dat.meta.S9, aes(x = iq, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

b. IQ diff

dat.meta.S9 = subset(dat.meta, !is.na(iq_diff) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S9$iq_diff = as.numeric(as.character(dat.meta.S9$iq_diff))


SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq_diff * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                                  Coef.
## 1                                                              intrcpt
## 2                                                              iq_diff
## 3         outcome_RDoCReception of facial communication (non-adjusted)
## 4               outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 iq_diff:outcome_RDoCReception of facial communication (non-adjusted)
## 6       iq_diff:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate     SE   t-stat  d.f. p-val (Satt) Sig.
## 1  1.363368 0.4047  3.36917 29.97      0.00209   **
## 2  0.013140 0.0441  0.29812  5.39      0.77676     
## 3 -0.790680 0.4146 -1.90726 37.65      0.06414    .
## 4 -0.554209 0.4759 -1.16447 33.85      0.25238     
## 5 -0.017017 0.0468 -0.36396  3.35      0.73768     
## 6  0.000401 0.0545  0.00737  5.85      0.99437
anova(SCE.S9, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 2.2257, p-val = 0.3286
SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq_diff + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt   1.3423 0.2553
## 2                                                      iq_diff   0.0107 0.0246
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.7065 0.1910
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.5525 0.1400
##   t-stat  d.f. p-val (Satt) Sig.
## 1  5.257 33.28       <0.001  ***
## 2  0.436  8.51        0.674     
## 3 -3.698 43.75       <0.001  ***
## 4 -3.948 44.93       <0.001  ***
ggplot(dat.meta.S9, aes(x = iq_diff, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

S10. Effect of rob

dat.meta.S10 = subset(dat.meta, !is.na(rob_tot) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
V.SCE.S10  <- with(dat.meta.S10,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S10 <- metafor::rma.mv(yi = es, V = V.SCE.S10, 
                          data = dat.meta.S10, 
                          mods = ~ rob_tot * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S10, vcov = "CR2", cluster = dat.meta.S10$ID_study)
##                                                                  Coef. Estimate
## 1                                                              intrcpt  1.13282
## 2                                                              rob_tot  0.01513
## 3         outcome_RDoCReception of facial communication (non-adjusted) -1.07372
## 4               outcome_RDoCUnderstanding mental states (non-adjusted) -0.43890
## 5 rob_tot:outcome_RDoCReception of facial communication (non-adjusted)  0.07767
## 6       rob_tot:outcome_RDoCUnderstanding mental states (non-adjusted)  0.00716
##       SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.2725  4.156  5.60      0.00695   **
## 2 0.0474  0.319  4.05      0.76560     
## 3 0.4356 -2.465 21.11      0.02237    *
## 4 0.2842 -1.544  5.00      0.18319     
## 5 0.0739  1.051 19.70      0.30594     
## 6 0.0486  0.147  4.14      0.88977
anova(SCE.S10, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 1.6539, p-val = 0.4374
SCE.S10 <- metafor::rma.mv(yi = es, V = V.SCE.S10, 
                          data = dat.meta.S10, 
                          mods = ~ rob_tot + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S10, vcov = "CR2", cluster = dat.meta.S10$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt   1.0640 0.1740
## 2                                                      rob_tot   0.0269 0.0295
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.5868 0.1066
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.3994 0.1100
##   t-stat  d.f. p-val (Satt) Sig.
## 1   6.12  9.71       <0.001  ***
## 2   0.91  5.62          0.4     
## 3  -5.50 88.14       <0.001  ***
## 4  -3.63 98.02       <0.001  ***
ggplot(dat.meta.S10, aes(x = rob_tot, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth() + #method ="lm"
    theme_bw()

S11. Type of tools

dat.meta.S11 = subset(dat.meta, !is.na(type_mesure) & outcome_RDoC== "Understanding mental states (non-adjusted)")
dat.meta.S11$vi = dat.meta.S11$se^2
dat.meta.S11$es_id = 1:nrow(dat.meta.S11)
SCE.S11 <- metafor::rma.mv(yi = es, V = vi, 
                          data = dat.meta.S11, 
                          mods = ~ type_mesure ,
                          random = ~ 1 | ID_study/es_id)

metafor::rma.mv(yi = es, V = vi, 
                          data = dat.meta.S11, 
                          mods = ~ type_mesure - 1,
                          random = ~ 1 | ID_study/es_id)
## 
## Multivariate Meta-Analysis Model (k = 186; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed          factor 
## sigma^2.1  0.2319  0.4815     56     no        ID_study 
## sigma^2.2  0.1638  0.4048    186     no  ID_study/es_id 
## 
## Test for Residual Heterogeneity:
## QE(df = 184) = 1025.9014, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## QM(df = 2) = 112.2712, p-val < .0001
## 
## Model Results:
## 
##                      estimate      se    zval    pval   ci.lb   ci.ub 
## type_mesureParadigm    0.7539  0.0819  9.2028  <.0001  0.5934  0.9145  *** 
## type_mesureReport      1.0250  0.1322  7.7540  <.0001  0.7659  1.2841  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggplot(dat.meta.S11, aes(x = type_mesure, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_boxplot(alpha = 0.2) + 
    geom_smooth() + #method ="lm"
    theme_bw()

S12. ADHD presentation

a. Inattentive

dat.meta.S12.a = subset(dat.meta, !is.na(percentage_inattentive) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S12.a$percentage_inattentive = as.numeric(as.character(dat.meta.S12.a$percentage_inattentive))
V.SCE.S12.a  <- with(dat.meta.S12.a,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S12.a <- metafor::rma.mv(yi = es, V = V.SCE.S12.a, 
                          data = dat.meta.S12.a, 
                          mods = ~ percentage_inattentive * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.a, vcov = "CR2", cluster = dat.meta.S12.a$ID_study)
##                                                                                 Coef.
## 1                                                                             intrcpt
## 2                                                              percentage_inattentive
## 3                        outcome_RDoCReception of facial communication (non-adjusted)
## 4                              outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_inattentive:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_inattentive:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate       SE  t-stat  d.f. p-val (Satt) Sig.
## 1  1.33e+00 0.113388 11.6973 33.72      < 0.001  ***
## 2 -2.86e-03 0.000694 -4.1235  1.13      0.12849     
## 3 -5.50e-01 0.204845 -2.6863 14.61      0.01721    *
## 4 -4.72e-01 0.168141 -2.8044 41.71      0.00762   **
## 5 -7.51e-05 0.005913 -0.0127  8.43      0.99017     
## 6  3.66e-03 0.000899  4.0764  1.12      0.13271
anova(SCE.S12.a, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 33.4410, p-val < .0001
SCE.S12.a <- metafor::rma.mv(yi = es, V = V.SCE.S12.a, 
                          data = dat.meta.S12.a, 
                          mods = ~ percentage_inattentive:outcome_RDoC - 1,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.a, vcov = "CR2", cluster = dat.meta.S12.a$ID_study)
##                                                                                 Coef.
## 1            percentage_inattentive:outcome_RDoCMixed social processes (non-adjusted)
## 2 percentage_inattentive:outcome_RDoCReception of facial communication (non-adjusted)
## 3       percentage_inattentive:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate       SE t-stat d.f. p-val (Satt) Sig.
## 1 -0.002799 0.000795  -3.52 1.13       0.1538     
## 2  0.013239 0.005376   2.46 7.34       0.0418    *
## 3  0.000975 0.000331   2.95 1.05       0.1992
ggplot(dat.meta.S12.a, aes(x = percentage_inattentive, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

b. Hyperactive

dat.meta.S12.b = subset(dat.meta, !is.na(percentage_hyperactive) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S12.b$percentage_hyperactive = as.numeric(as.character(dat.meta.S12.b$percentage_hyperactive))
V.SCE.S12.b  <- with(dat.meta.S12.b,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S12.b <- metafor::rma.mv(yi = es, V = V.SCE.S12.b, 
                          data = dat.meta.S12.b, 
                          mods = ~ percentage_hyperactive * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.b, vcov = "CR2", cluster = dat.meta.S12.b$ID_study)
##                                                                                 Coef.
## 1                                                                             intrcpt
## 2                                                              percentage_hyperactive
## 3                        outcome_RDoCReception of facial communication (non-adjusted)
## 4                              outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_hyperactive:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_hyperactive:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1  1.260353 0.1580  7.978 32.46       <0.001  ***
## 2  0.000807 0.0106  0.076  1.16       0.9504     
## 3 -0.606438 0.2032 -2.984 35.80       0.0051   **
## 4 -0.432498 0.2143 -2.018 40.58       0.0502    .
## 5  0.003804 0.0120  0.317  1.61       0.7878     
## 6  0.006235 0.0195  0.320  1.94       0.7798
anova(SCE.S12.b, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 2.6712, p-val = 0.2630
SCE.S12.b <- metafor::rma.mv(yi = es, V = V.SCE.S12.b, 
                          data = dat.meta.S12.b, 
                          mods = ~ percentage_hyperactive+outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.b, vcov = "CR2", cluster = dat.meta.S12.b$ID_study)
##                                                          Coef. Estimate      SE
## 1                                                      intrcpt  1.25097 0.13739
## 2                                       percentage_hyperactive  0.00177 0.00721
## 3 outcome_RDoCReception of facial communication (non-adjusted) -0.57155 0.16800
## 4       outcome_RDoCUnderstanding mental states (non-adjusted) -0.38331 0.16787
##   t-stat  d.f. p-val (Satt) Sig.
## 1  9.105 32.74      < 0.001  ***
## 2  0.246  1.52      0.83500     
## 3 -3.402 39.13      0.00155   **
## 4 -2.283 42.44      0.02748    *
ggplot(dat.meta.S12.b, aes(x = percentage_hyperactive, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

c. Combined

dat.meta.S12.c = subset(dat.meta, !is.na(percentage_combined) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S12.c$percentage_combined = as.numeric(as.character(dat.meta.S12.c$percentage_combined))
V.SCE.S12.c  <- with(dat.meta.S12.c,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S12.c <- metafor::rma.mv(yi = es, V = V.SCE.S12.c, 
                          data = dat.meta.S12.c, 
                          mods = ~ percentage_combined * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.c, vcov = "CR2", cluster = dat.meta.S12.c$ID_study)
##                                                                              Coef.
## 1                                                                          intrcpt
## 2                                                              percentage_combined
## 3                     outcome_RDoCReception of facial communication (non-adjusted)
## 4                           outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_combined:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_combined:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate       SE t-stat  d.f. p-val (Satt) Sig.
## 1  1.05997 0.129152  8.207 31.17       <0.001  ***
## 2  0.00298 0.000578  5.154  1.06       0.1110     
## 3 -0.26144 0.339580 -0.770  7.55       0.4648     
## 4 -0.12509 0.182362 -0.686 37.05       0.4970     
## 5 -0.00462 0.004235 -1.090  7.46       0.3097     
## 6 -0.00389 0.000623 -6.232  1.12       0.0831    .
anova(SCE.S12.c, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 38.0168, p-val < .0001
SCE.S12.c <- metafor::rma.mv(yi = es, V = V.SCE.S12.c, 
                          data = dat.meta.S12.c, 
                          mods = ~ percentage_combined+outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.c, vcov = "CR2", cluster = dat.meta.S12.c$ID_study)
##                                                          Coef. Estimate
## 1                                                      intrcpt  1.15551
## 2                                          percentage_combined  0.00153
## 3 outcome_RDoCReception of facial communication (non-adjusted) -0.55775
## 4       outcome_RDoCUnderstanding mental states (non-adjusted) -0.36555
##         SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.123538   9.35 32.70      < 0.001  ***
## 2 0.000438   3.50  1.13      0.15445     
## 3 0.166051  -3.36 39.26      0.00175   **
## 4 0.169476  -2.16 42.64      0.03669    *
ggplot(dat.meta.S12.c, aes(x = percentage_combined, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()